描述 | |
---|---|
知识点 | 查找,搜索,排序 |
运行时间限制 | 10M |
内存限制 | 128 |
输入 | 输入两个整数,分别表示二位数组的行数,列数。再输入相应的数组,其中的1表示墙壁,0表示可以走的路。数据保证有唯一解,不考虑有多解的情况,即迷宫只有一条通道。 |
输出 | 左上角到右下角的最短路径,格式如样例所示。 |
样例输入 | 5 5 0 1 0 0 0 0 1 0 1 0 0 0 0 0 0 0 1 1 1 0 0 0 0 1 0 |
样例输出 | (0,0) (1,0) (2,0) (2,1) (2,2) (2,3) (2,4) (3,4) (4,4) |
#include <iostream>
#include <string>
#include <vector>
#include <algorithm>
#include <map>
#include <deque>
//#include "Customer.h"
using namespace std;
struct Point
{
int x;
int y;
};
int mat[100][100] = { 0 };
int N, M;
deque<Point> path;
deque<Point> minPath;
//判断当前点是否可行
bool correct(int i, int j)
{
if ((i >= 1 && i <= N) && (j >= 1 && j <= M) && mat[i][j] == 0)
return true;
else
return false;
}
//采用回溯法解决迷宫最短路径问题,遍历所有可行路径path,minPath保存最短路径
void visit(int i, int j)
{
mat[i][j] = 2;
Point pt;
pt.x = i;
pt.y = j;
path.push_back(pt);
if (i == N && j == M)
{
if (minPath.empty() || path.size() < minPath.size())
{
minPath.assign(path.begin(), path.end());
}
mat[i][j] = 0;
path.pop_back();
return;
}
if (correct(i - 1, j))
{
visit(i - 1, j);
}
if (correct(i + 1, j))
{
visit(i + 1, j);
}
if (correct(i, j - 1))
{
visit(i, j - 1);
}
if (correct(i, j + 1))
{
visit(i, j + 1);
}
mat[i][j] = 0;
path.pop_back();
}
int main()
{
cin >> N >> M;
for (int i = 1; i <= N; i++)
{
for (int j = 1; j <= M; j++)
cin >> mat[i][j];
}
visit(1, 1);
for (int i = 0; i < minPath.size(); i++)
cout << "(" << minPath[i].x-1 << "," << minPath[i].y -1<< ")" << endl;
return 0;
}